
#include "test_case.hpp"

/*
g++ test_case.cpp -static -I../insdir/include -L../insdir/lib -lboost_system -lpthread -lboost_coroutine -lboost_context
*/

int test_case0_p11_boost_version(void) {
    using namespace std;

    cout << BOOST_VERSION << endl;
    cout << BOOST_LIB_VERSION << endl;
    cout << BOOST_PLATFORM << endl;
    cout << BOOST_COMPILER << endl;
    //cout << BOOST_STDLIB << endl;
    std::printf("helloworld\n");
    return 0;
}

void test_case1_io_context() {
    
    using namespace boost;
    asio::io_context ioc;
    asio::ip::tcp::endpoint ep(asio::ip::address::from_string("127.0.0.1"), 6768);
    asio::ip::tcp::socket sock(ioc, ep.protocol());
    asio::ip::tcp::socket sock1(ioc, ep.protocol());
 
    sock.async_connect(ep, [](const std::error_code & err) {
        if (err.value() != 0) {
            std::cout << "Error: "<< err.message() << std::endl;
        }
    });
   
    sock1.async_connect(ep, [](const std::error_code & err) {
        if (err.value() != 0) {
            std::cout << "Error: "<< err.message() << std::endl;
        }
    });
    ioc.run();

    getchar();                        
//原文链接：https://blog.csdn.net/liyazhen2011/article/details/103615124/
}

/*

 有时候, 我们希望调用run()后，即使没有io事件, 也不会退出事件循环, 而是一直等待, 当有了新的异步io调用的时候, 还可以继续使用该循环。 
 asio::io_context::work可以防止io_context在没有io事件的情退出

*/

void test_case1_io_context_work() {
    using namespace boost;
    asio::io_context ioc;
    asio::ip::tcp::endpoint ep(asio::ip::address::from_string("127.0.0.1"), 6768);
    asio::ip::tcp::socket sock(ioc, ep.protocol());
    asio::ip::tcp::socket sock1(ioc, ep.protocol());
 
    asio::io_context::work worker(ioc);
    std::thread t([&ioc]() {ioc.run(); });
   
    sock.async_connect(ep, [](const std::error_code & err) {
        if (err.value() != 0) {
            std::cout << "Error: " << err.message() << std::endl;
        }
    });
    
    sock1.async_connect(ep, [](const std::error_code & err) {
        if (err.value() != 0) {
            std::cout <<"Error: "<< err.message() << std::endl;
        }
    });
   
    std::cout << "Main thread will for 3 seconds...\n";  // 防止stop()执行过快
    std::this_thread::sleep_for(std::chrono::seconds(3));
    std::cout << "Main thread wake up...\n";
    ioc.stop();  // 显式停止io_context, 否则无法终止
    t.join();
          
//原文链接：https://blog.csdn.net/liyazhen2011/article/details/103615124/
}

int main() {

    test_case0_p11_boost_version();
    test_case1_io_context();
    return 0;
}   